package top.lishuoboy.redis.controller;
/**
 * @author lishuoboy
 * @date 2024/9/24
 */

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import top.lishuoboy.redis.service.IdGenerator;

/**
 * @author lishuoboy
 * @date 2024/9/24
 */
@Api(tags = "ID生成器")
@RequestMapping("/idGenerator")
@RestController
public class IdGeneratorController {
    @Autowired
    private IdGenerator idGenerator;

    /**
     * <h1>生成id</h1>
     * 优点: long占用存储空间小，数据库索引性能高<br>
     * 缺点：不便于阅读<br>
     *
     * @param key key建议用表名.字段名，如“user_info.id”; 默认为“table_name.id”
     *
     * @return id
     */
    @ApiOperation(value = "生成id")
    @GetMapping("/genId")
    private Long genId(
        @ApiParam(value = "key建议用表名.字段名，如“user_info.id”; 默认为“table_name.id”")
        @RequestParam
        String key
    ) {
        return idGenerator.genId(key);
    }

    /**
     * <h1>生成id</h1>
     * 缺点: String占用存储空间大，数据库索引性能低<br>
     * 优点：便于阅读<br>
     *
     * @param key         key建议用表名.字段名，如“user_info.id”; 默认为“table_name.id”
     * @param pre         id前缀，建议用表名缩写，user_info表用“UI”，默认为空
     * @param dateFormat  id日期格式，默认yyyyMMdd
     * @param sequenceLen id序列号长度，默认8
     *
     * @return id（pre + 格式为dateFormat的日期 + 长度为sequenceLen的数字）
     */
    @ApiOperation(value = "生成id字符串")
    @GetMapping("/genIdStr")
    private String genIdStr(
        @ApiParam(value = "key建议用表名.字段名，如“user_info.id”; 默认为“table_name.id”")
        @RequestParam
        String key,
        @ApiParam(value = "id前缀，建议用表名缩写，user_info表用“UI”，默认为空")
        String pre,
        @ApiParam(value = "id日期格式，默认yyyyMMdd")
        IdGenerator.DateFormatEnum dateFormat,
        @ApiParam(value = "id序列号长度，默认8")
        Integer sequenceLen
    ) {
        return idGenerator.genIdStr(key, pre, dateFormat, sequenceLen);
    }
}
